package nespresso.servlets;

import java.io.IOException;

import javax.mail.Session;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import nespresso.beans.*;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.*;

public class ListeLigneServlet extends HttpServlet {

        private static final long serialVersionUID = 1L;
        private Log log;
        private HttpSession session;
        
        public ListeLigneServlet() {
                log = LogFactory.getLog(Base.class);
        }

        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                /*
                 * si l'utilisateur tape l'adresse de la servlet directement dans la barre d'adresse, il est renvoyé
                 * sur la page d'accueil !
                 */
                response.sendRedirect("nespresso.jsp");
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, NullPointerException {
        	try {
                // on ouvre une session pour y mettre nos objets et pour protéger les pages
        		session  = request.getSession();
                Commande c = (Commande)session.getAttribute("commande");
                User currentUser = (User)session.getAttribute("user");
                RequestDispatcher reqDispatcher;
                Ligne l;
                int nb_new = 0;
                String nuligne = null;
                
                l = c.GetLigne1();
                // on récupère la valeur du bouton de validation
                request.setCharacterEncoding("UTF-8");
                String bvalide = request.getParameter("Valide");
                if(bvalide.equals("Retour")) response.sendRedirect("commandes.jsp"); // Retour aux commandes
                else {
                        if(bvalide.equals("Nouvelle ligne")) { // Aller nouvelle ligne
                                reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignenew.jsp");
                                reqDispatcher.forward(request,response);
                        } else 
                        	if(bvalide.equals("Paiements")) {
                            	reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/reglercommande.jsp");
                            	reqDispatcher.forward(request,response);                       	
                        	} else {
                        		nuligne = request.getParameter("nLigne");
                                if(!nuligne.equals("NULL")) {
                                	if(bvalide.equals("Modifier la ligne")) {
                                		request.setAttribute("NumLigne", nuligne);
                                        session.setAttribute("lignesel", c.GetLigne(nuligne));
                                        session.setAttribute("commande", c);
                                        session.setAttribute("action", bvalide);
                                        reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/ligne.jsp");
                                        reqDispatcher.forward(request,response);
                                    }
                                    if(bvalide.equals("Supprimer la ligne")){
                                    	request.setAttribute("NumLigne", nuligne);
                                        l = c.GetLigne(nuligne);
                                        l.DeleteLigne(c);
                                        c.UpdateCommande();
                                        request.setAttribute("LigneMessage", "Suppression effectuée avec succès !");
                                        reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignescommande.jsp");
                                        reqDispatcher.forward(request,response);
                                    }
                                } else {
                                	User UserTo = new User();
                                    Base bu = new Base(); Base bl = new Base();
                                    if(bvalide.equals("=> EN PAIEMENT")) { 
                                    	c.SetStatut(c.GetStatutSuivant());
                                        c.UpdateCommande();
                                        bl.ExecuteRequete("SELECT DISTINCT LIGNESCDE.ID_USER FROM LIGNESCDE, PAIEMENTS WHERE LIGNESCDE.ID_COMMANDE='"+c.GetId()+"' AND LIGNESCDE.ID_USER=PAIEMENTS.ID_USER AND PAIEMENTS.STATUT='A_PAYER'");
                                        while(bl.Suivant()) {
                                        	bu.GetResultat("USERS", "ID", bl.GetTexte("ID_USER")); bu.Suivant();
                                            UserTo.setId(bu.GetTexte("ID"));
                                            UserTo.setLogin(bu.GetTexte("LOGIN"));
                                            UserTo.setPrenom(bu.GetTexte("PRENOM"));
                                            UserTo.setNom(bu.GetTexte("NOM"));
                                            UserTo.setEmail(bu.GetTexte("EMAIL"));
                                            new EnvoiMail(currentUser, UserTo, "LIVREE"+c.GetId());
                                        }
                                        request.setAttribute("LigneMessage", "Nouveau statut : " + c.GetStatut() + ".");
                                        reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignescommande.jsp");
                                        reqDispatcher.forward(request,response);
                                    }
                                                        
                                    if(bvalide.equals("=> LIVRÉE")) {
                                    	c.SetStatut(c.GetStatutSuivant());
                                    	c.UpdateCommande();
                                    	Base bpai = new Base();
                                    	bpai.GetResultat("PAIEMENTS", "ID_COMMANDE", c.GetId());
                                    	while(bpai.Suivant()) {
                                    		bu.GetResultat("USERS", "ID", bpai.GetTexte("ID_USER")); bu.Suivant();
                                    		if(!bu.GetTexte("EMAIL").equals("")) {
                                    			UserTo.setId(bu.GetTexte("ID"));
                                    			UserTo.setLogin(bu.GetTexte("LOGIN"));
                                    			UserTo.setPrenom(bu.GetTexte("PRENOM"));
                                    			UserTo.setNom(bu.GetTexte("NOM"));
                                    			UserTo.setEmail(bu.GetTexte("EMAIL"));
                                    			new EnvoiMail(currentUser, UserTo, "LIVREE"+c.GetId());
                                    		}
                                    	}
                                    	bpai.Free();
                                    	request.setAttribute("LigneMessage", "Nouveau statut : " + c.GetStatut() + ".");
                                    	reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignescommande.jsp");
                                    	reqDispatcher.forward(request,response);
                                    }
                                    if(bvalide.equals("=> EN COMMANDE")) {
                                    	// Création des lignes de paiement
                                    	
                                    	// Vérification que le nombre de cartouches est un multiple de 5
                                    	int nbcartouche;
                                    	Base bc = new Base(); 
                                    	bc.ExecuteRequete("SELECT SUM(NOMBRE) AS TOTAL FROM LIGNESCDE WHERE ID_COMMANDE='" + c.GetId() + "'");
                                    	nbcartouche = bc.GetEntier("TOTAL");
                                    	bc.Free();
                                    	if(nbcartouche % 5 != 0) {
                                    		request.setAttribute("MessageBox", "Attention : le nombre de cartouche n'est pas un multiple de 5.");
                                    		reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignescommande.jsp");
                                        	reqDispatcher.forward(request,response);
                                    	}
                                    	
                                    	Base bpai = new Base(); bpai.InsertPaiments(c); bpai.Free();
                                    	c.SetStatut(c.GetStatutSuivant());
                                    	c.UpdateCommande();
                                    	bu.GetResultat("USERS");
                                    	while(bu.Suivant())
                                    		if(bu.GetTexte("EMAIL") != null)
                                    			if(!bu.GetTexte("EMAIL").equals("")) {
                                    				UserTo.setId(bu.GetTexte("ID"));
                                    				UserTo.setLogin(bu.GetTexte("LOGIN"));
                                    				UserTo.setPrenom(bu.GetTexte("PRENOM"));
                                    				UserTo.setNom(bu.GetTexte("NOM"));
                                    				UserTo.setEmail(bu.GetTexte("EMAIL"));
                                    				new EnvoiMail(currentUser, UserTo, "ENCOMMANDE"+c.GetId());
                                    			}
                                    	bu.Free();
                                    	request.setAttribute("LigneMessage", "Nouveau statut : " + c.GetStatut() + ".");
                                    	reqDispatcher = getServletConfig().getServletContext().getRequestDispatcher("/lignescommande.jsp");
                                    	reqDispatcher.forward(request,response);
                                    } else {
                                    	response.sendRedirect("lignescommande.jsp");
                                    }
                                    
                                }
                        }
                }
        } catch (NullPointerException n) {
        	session.invalidate();
        	response.sendError(response.SC_INTERNAL_SERVER_ERROR, "Session expirée ou erreur inattendue !");
        	response.sendRedirect("nespresso.jsp");
        }
     }
}

